package com.lagou.handler;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lagou.service.UserServiceImpl;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.concurrent.EventExecutorGroup;

import java.lang.reflect.Method;

/**
 * 自定义的业务处理器
 */
public class UserServiceHandler extends ChannelInboundHandlerAdapter {

    //当客户端读取数据时,该方法会被调用
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        //注意:  客户端将来发送请求的时候会传递一个参数:  UserService#sayHello#are you ok
         //1.判断当前的请求是否符合规则
        if(msg.toString().startsWith("UserService")){
            //2.如果符合规则,调用实现类货到一个result
            //UserServiceImpl service = new UserServiceImpl();
            //String result = service.sayHello(msg.toString().substring(msg.toString().lastIndexOf("#")+1));

            JSONObject json=JSONObject.parseObject(msg.toString().substring(msg.toString().lastIndexOf("#")+1));
            String requestId=json.getString("requestId");
            String className=json.getString("className");
            String methodName=json.getString("methodName");
            JSONArray parameterTypes=json.getJSONArray("parameterTypes");
            JSONArray parameters= json.getJSONArray("parameters");


            Class<?> userClass = Class.forName(requestId+"."+className);
            Object obj=userClass.newInstance();

            Object resultMsg="";

            if(parameterTypes!=null && parameterTypes.size()>0){
                //获取方法参数类型
                String type=(String)parameterTypes.get(0);
                //放射得到参数类型对象
                Class<?> typeClass = Class.forName(type);
                Object object=typeClass.newInstance();
                Method method= userClass.getMethod(methodName,object.getClass());//得到正式类型并获取该方法
                String c=(String)parameters.get(0);//得到参数
                resultMsg= method.invoke(obj,c);//执行目标有参方法
            }else{//无参方法
                Method method=userClass.getMethod(methodName);
                resultMsg=method.invoke(obj);
            }






            //3.把调用实现类的方法获得的结果写到客户端
            ctx.writeAndFlush(resultMsg.toString());
        }


    }


    public static void  main(String[] a){

        String aa="UserService#sayHello#收到请回答 !!";
        String cal="com.lagou.boot.UserServiceImpl";
        try {
            Class.forName("com.lagou.service.UserServiceImpl");
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}
